﻿/*******************************************************************************
 * Copyright © 2016-2020 北京网非科技有限公司 版权所有
 * Author: 北京网非科技有限公司
 * Description: 网非快速开发平台NET
 * Website：http://www.wfdot.com
*********************************************************************************/
using CubicFWNet.Common;
using CubicFWNet.Data.SystemManage;
using CubicFWNet.Data.SystemManage.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CubicFWNet.Application
{
    public class AuthoriseApp
    {
        protected User _user;

        private List<Guid> _userRoleIds;    //用户角色GUID

        private RelevanceRepository _relevanceRepository = new RelevanceRepository();
        private ModuleRepository _moduleRepository = new ModuleRepository();
        private RoleRepository _roleRepository = new RoleRepository();

        public List<Module> Modules
        {
            get { return GetModulesQuery().ToList(); }
        }

        public List<Role> Roles
        {
            get { return GetRolesQuery().ToList(); }
        }

        public User User
        {
            get { return _user; }
            set
            {
                _user = value;
                _userRoleIds = _relevanceRepository.IQueryable(u => u.FirstId == _user.Id && u.Type == "UserRole").Select(u => u.SecondId).ToList();
            }
        }

        /// <summary>
        /// 得出最终用户拥有的模块
        /// </summary>
        public virtual IQueryable<Module> GetModulesQuery()
        {
            var moduleIds = _relevanceRepository.IQueryable(
                u =>
                    (u.FirstId == _user.Id && u.Type == "UserModule") ||
                    (u.Type == "RoleModule" && _userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId);
            return _moduleRepository.IQueryable(u => moduleIds.Contains(u.Id)).OrderBy(u => u.SortNo);
        }

        //用户角色
        public virtual IQueryable<Role> GetRolesQuery()
        {
            return _roleRepository.IQueryable(u => _userRoleIds.Contains(u.Id));
        }

      
    }
}
